//
//  main.m
//  first-oc.class
//
//  Created by 郭志远 on 2023/11/21.
//

#import <Foundation/Foundation.h>

/*
 事物名称：iPhone
 属性：颜色，型号，尺寸
 行为：打电话，发短信
 
 C语言中函数分为声明和实现
 OC中定义一个类也分为声明和实现，也就是说以后我们在OC中定义类，就是在写类的声明和实现
 */

// 1.编写类的声明
// 以@interface，@end,然后再class name对应的地方写上 事物的名称，也就是类名
// 注意：类名首字符必须大写
// 声明一个类的目的是为了告诉系统这个类有哪些属性和行为
// OC类声明中属性只能写在@interface，@end之间的{}中
// 注意：编写OC类属性时，建议将所有的属性的名称前都加上_

// 类名后面的 :NSObject 是为了让我们的Iphone类具备创建对象的能力
@interface Iphone : NSObject
{
//    默认OC对象中的属性是不能直接访问的
    @public
    float _model;
    int _cpu;
    double _size;
    int _color;
}

//行为
@end
// 2.如何编写类的实现
// 以@implementation开头，以@end结尾，然后在class对应的地方写上声明时类的名称，必须和声明的类名一模一样

@implementation Iphone


@end
int main(int argc, const char * argv[]) {
    //  如何通过一个类创建对象
    //  在OC中想要通过一个类创建一个对象，必须给类发一个消息（好比C语言中调用方法一样）
    //  如何发送消息？在OC中只要想发送消息就先写[类名称/对象名称 方法名称];
    //  发送什么消息（调用什么方法）可以创建一个对象？new
    
    /*
     只要通过一个类调用new方法，给这个类发送一个new的消息之后，内部就会做3件事
     1. 为Iphone类创建出来的对象分配存储空间
     2. 初始化Iphone类创建出来的对象中的属性
     3. 返回IPhone类创建出来的对象对应的地址
     */
    
    //通过一个Iphone类型的指针接收了Iphone对象的地址
    // 如果使用给一个指针保存了某一个对象的地址，那么我们就称这个指针为某个类型的对象
    // 利用Iphone类型的指针保存了Iphone对象的地址，那么我们就称Iphone类型的指针p为Iphone对象
    Iphone *p = [Iphone new];
    p->_color = 0;
    p->_cpu = 2;
    p->_model = 2.2;
    p->_size = 2.2;
    
    // OC中的类其实本职就是一个结构体，所以p这个指针其实就是指向了一个结构体
    NSLog(@"size = %f, color = %i, model = %f, cpu = %i",p->_size,p->_color,p->_model, p->_cpu);
    // 什么是用于保存地址的？指针
  
    return 0;
}
